<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
	// > * let命令不存在变量提升
	// > >  和var不同的还有，let命令不存在变量提升，所以声明前调用变量，都会报错，这就涉及到一个概念——暂时性死区。
	// {
	// 	console.log(a);// Cannot access 'a' before initialization
	// 	let a = 1;
	// 	console.log(a);
    // }
	// > >  暂时性死区即：区块中存在`let`或`const`命令，这个区块对这些命令声明的变量，从一开始就形
	// > >  成了封闭作用域。凡是在声明之前就使用这些变量，就会报错。
	{
		// 变量提升 es5  undefined(只声明未赋值，函数未传递参数，对象中的属性不存在)
		// console.log(a);// undefined
        // var a = 1;
		// console.log(a);// 1

        // 编译
        // var a;
		// console.log(a);// undefined
		// a=1;
		// console.log(a);// 1
    }


	// > * 不允许重复声明
	// > > let 只能声明一次而var 可以声明多次。
	// {
	// 	// es5
    //     // var a = 1;
	// 	// var a = 2;
	// 	// console.log(a);// 2
    //
    //     // es6
    //     let b = 100;
	// 	let b = 200;// Identifier 'b' has already been declared
	// 	console.log(b)
    // }

	// > * 块级作用域的出现，实际上使得获得广泛应用的匿名立即执行函数表达式不再必要了
	{
		// // 扩展
        // // 声明函数1
        // function fn(){
        //
        // }
		// // 声明函数2
        // var fn2 = function(){
        //
        // };
        //
		// // 匿名函数
        // // (function(a,b,c){
		// // 	console.log(a,b,c);
		// // 	var age = 100;
        // // })(1,2,3)
		// // console.log(age);
        //
		// {
		// 	let age = 100;
        // }


    }



	// > * let 是在代码块内有效，var 是在全局范围内有效
	{
		// let a = 1;
    }
	// > * 不影响作用域链
	// > > let与var都拥有作用域链。
	// {
	// 	// let a = 1;
	// 	{
	// 		// let a = 2;
	// 		{
	// 			// let a = 3;
	// 			{
	// 				console.log(a);
    //             }
    //         }
    //     }
    // }
	// > > 作用域链： 如果在当前作用域中没有查到值，就会向上级作用域去查，直到查到全局作用域，这么一个查找过程形成的链条就叫做作用域链。
	// >
	// > * 不再是顶层全局对象的属性
	// > >  使用var定义的全局变量相当于直接挂载在window对象上， 而let不会。
    // es5:顶级对象 window
    // var age = 100;// 相当于window.age = 100;
	// console.log(age);// 100
	// console.log(window.age);// 100
	// console.log(window);

    // es6
    // let age = 90;
	// console.log(age);
	// console.log(window.age);// undefined
</script>
</html>